home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / misc~1 / 28 / m2speech / speech.mod < prev    next >
Text File  |  1987-04-04  |  4KB  |  119 lines

  1. IMPLEMENTATION MODULE          speech;
  2.  
  3. FROM    SYSTEM  IMPORT  ADDRESS,ADR,BYTE,REGISTER;
  4.  
  5. FROM    Strings IMPORT  Length;
  6.  
  7. FROM    GEMX    IMPORT  BasePageType;
  8.  
  9. FROM    XBIOS   IMPORT  SuperExec;
  10.  
  11. FROM    GEMDOS  IMPORT  Exec,ExecMode;
  12.  
  13. FROM    M2Conversions   IMPORT  ConvertCardinal;
  14.  
  15. TYPE    
  16.         speechcodeptr     =      POINTER TO ARRAY [0..30000] OF BYTE;
  17.  
  18.  
  19. VAR
  20.         speechcode                      :       speechcodeptr;
  21.         codeadr                         :       POINTER TO BasePageType;
  22.         filename,nulls                  :       ARRAY [0..15] OF CHAR;
  23.         filehandle,i,j,strlen,result    :       INTEGER;
  24.         done,filter                     :       BOOLEAN;
  25.         entry,talk                      :       ADDRESS;
  26.         recordsize                      :       LONGCARD;
  27.         r,p                             :       CARDINAL;
  28.  
  29. CONST
  30.         codestart       =       1CH;
  31.         codeinlup       =       2AH;
  32.         codeentry       =       4EH;
  33.         codebuffermax   =       28398;
  34.         codebufferlen   =       28399;
  35.         codebuffer      =       28400;
  36.  
  37. PROCEDURE       initspeechmodule(): BOOLEAN;
  38. BEGIN
  39.         filter:=TRUE;
  40.         nulls:="";
  41.         filename:="SPEECH.EXE";
  42.         Exec(ExecMode(3),filename,nulls,nulls,result);
  43.         codeadr:=REGISTER(0);
  44.  
  45.         IF LONGINT(codeadr)<LONGINT(0) THEN
  46.         RETURN FALSE ;
  47.         END; (* no SPEECH.EXE loaded *)
  48.  
  49.         speechcode:=codeadr^.CodeBase;
  50.         entry:=speechcode;
  51.  
  52.         speechcode^[14]:=BYTE(78); (* put RTS in code *)
  53.         speechcode^[15]:=BYTE(117);
  54.         FOR i:=0 TO 13 DO          (* put NOP in code *)
  55.             speechcode^[108+(i*2)]:=BYTE(78);
  56.             speechcode^[109+(i*2)]:=BYTE(113);
  57.         END;
  58.         RETURN TRUE;
  59. END     initspeechmodule;
  60.  
  61. PROCEDURE       setpitch(pitch: CARDINAL);
  62. BEGIN
  63.         pitch:=pitch+12325;
  64.         IF pitch<=12415 THEN
  65.            ConvertCardinal(pitch,6,nulls);
  66.            nulls[0]:='!';
  67.            filter:=FALSE;
  68.            say(nulls);
  69.            filter:=TRUE;
  70.         END;
  71. END             setpitch;
  72.  
  73. PROCEDURE       setrate(rate: CARDINAL);
  74. BEGIN
  75.         rate:=rate+20;
  76.         IF rate<=127 THEN
  77.            IF rate<100 THEN
  78.               ConvertCardinal(rate,3,nulls);
  79.            ELSE
  80.               ConvertCardinal(rate,4,nulls);
  81.            END;
  82.            nulls[0]:='%';
  83.            filter:=FALSE;
  84.            say(nulls);
  85.            filter:=TRUE;
  86.         END;
  87. END             setrate;
  88.  
  89. PROCEDURE       say(VAR text: ARRAY OF CHAR);
  90. BEGIN
  91.         strlen:=INTEGER(Length(text));
  92.         IF strlen>0 THEN
  93.            speechcode^[codebuffermax]:=BYTE(254);
  94.            speechcode^[codebufferlen]:=BYTE(strlen);
  95.            FOR i:=0 TO strlen-1 DO
  96.            IF filter THEN
  97.               IF text[i]='.' THEN text[i]:=' ' END;
  98.               IF text[i]='!' THEN text[i]:=' ' END;
  99.               IF text[i]='%' THEN text[i]:=' ' END;
  100.               IF text[i]='[' THEN text[i]:=' ' END;
  101.               IF text[i]=']' THEN text[i]:=' ' END;
  102.               IF text[i]='{' THEN text[i]:=' ' END;
  103.               IF text[i]='}' THEN text[i]:=' ' END;
  104.            END;
  105.            speechcode^[codebuffer+i]:=BYTE(text[i]);
  106.            END;
  107.  
  108.            i:=INTEGER(speechcode^[0]);
  109.            IF i = 72 THEN       (* check for correct code before jumping *)
  110.               talk:=entry+50 ;
  111.               (*$S- *)
  112.               SuperExec(PROC(talk)); 
  113.               (*$S+ *)
  114.            END;
  115.         END;
  116. END     say;
  117.  
  118. BEGIN
  119. END             speech.